package com.itheima.d6_map_impl;

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;

/**
 * 目标：掌握LinkedHashMap的底层原理。
 *
 *  底层数据结构依然是基于哈希表实现的，只是每个键值对元素又额外的多了一个双链表的机制，来记录元素添加的顺序(保证有序)。
 *  实际上：原来学习的LinkedHashSet集合的底层原理就是LinkedHashMap。
 *
 * 原理：
 *      把键和值封装为一个entry对象，然后底层分配一个长度16的数组，然后用entry对象的键求哈希值对底层数组求余，计算到在数组中的位置
 */
public class Test2LinkedHashMap {
    public static void main(String[] args) {
        // Map<String, Integer> map = new HashMap<>();    //  按照键 无序，不重复，无索引。{null=null, 手表=220, Java=2, 手机=2}
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); //  按照键 有序，不重复，无索引。 {手表=220, 手机=2, Java=2, null=null}
        map.put("手表", 100);
        map.put("手表", 220);
        map.put("手机", 2);
        map.put("Java", 2);
        map.put(null, null);
        System.out.println(map);

        /*源码：
        public LinkedHashSet() {
        super(16, .75f, true);
        }
        看super父类的构造器源码：
         HashSet(int initialCapacity, float loadFactor, boolean dummy) {
        map = new LinkedHashMap<>(initialCapacity, loadFactor);
        }
        LinkedHashSet集合的底层原理就是基于LinkedHashMap实现的，但是LinkedHashSet只要LinkedHashMap的键元素
         */
        new LinkedHashSet<>();
    }
}
